Perlin Noise
#Noise
https://gyazo.com/c434389e8cc848edb08089bd7198f477
Ken Perlinによるノイズ
本記事は、Perlin 2002、 Improving Noiseに基づく
基本的な流れ
座標系を座標系に直交な格子状のセルに分ける
https://gyazo.com/d6decd9e0ebe505c94947eb614701709
各セルの角にランダムな方向ベクトルを生成する
https://gyazo.com/cd16f3ac4246bc16990c881fa6f20f62
原文ではここのベクトルの作り方にすごい癖がある
各ピクセル、4つの角に対して、角からの相対座標で、ベクトルの向きとの内積を取る
https://gyazo.com/a6c1bbc95a513b44bd8f39f8538f0397
smootherstep(5次のエルミート補間 Hermite polynomials)で補間
https://gyazo.com/d86c515d24f23993a6501a4f2e9a2c6f
古い手法だとsmoothstepを使っていたらしい
2回微分取るときたないし、アーティファクトも出ていた
https://www.shadertoy.com/view/NstyR7
ランダム
Perlinの論文によると、各頂点に生成する方向ベクトルは、以下の12通りらしい:
code:plain
( 1, 1, 0), (-1, 1, 0), ( 1, -1, 0), (-1, -1, 0)
( 1, 0, 1), (-1, 0, 1), ( 1, 0, -1), (-1, 0, -1)
( 0, 1, 1), ( 0, -1, 1), ( 0, 1, -1), ( 0, -1, -1)
Permutation Tableをルックアップしてこの12のうちのいずれかを指定している
まあ2002年当時のパフォーマンスに最適化した結果だと思うので、今更そんなに気にしなくてもいいんじゃないですかね
GLSL
https://www.shadertoy.com/view/ddsXW2
3次元を出す
https://gyazo.com/27e5c205fd7dfe4c23a213c0fb830073
https://www.shadertoy.com/view/lcK3z3
各セルごとの方向と内積を取るところ、方向を3つ mat3 にまとめた上で、行列とベクトルの掛け算をすると、サクッと3方向との内積が計算できて便利